iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

當我們討論物件導向的時候,通常會聽到“類別”、“繼承”和“多態性”等詞彙。然而,Swift為我們帶來了另一種有力的工具:協定。今天,我們將深入了解Swift中的協定(Protocols),並學習如何有效地實現它們。

什麼是協定?

協定定義了一套要求,該要求可被類別、結構或列舉採用和實現。它可以指定屬性和方法的名稱,但不提供實現。你可以將協定看作是一種能夠被多個類型實現的接口或模板。

protocol SomeProtocol {
    var someProperty: Int { get set }
    func someMethod()
}

如何實現協定?

當類別或結構採用某一協定時,它必須提供該協定中定義的所有方法和屬性的具體實現。

struct SomeStruct: SomeProtocol {
    var someProperty: Int = 0

    func someMethod() {
        print("This is a method from the protocol!")
    }
}

如果類別已經有了父類,則將協定名稱放在父類名稱之後,用逗號分隔:

class SomeClass: SomeSuperclass, FirstProtocol, SecondProtocol {
    // class implementation
}

協定的特性

1. 屬性要求

協定可以要求其遵循者提供特定名稱和類型的實例屬性或類型屬性。

protocol AnotherProtocol {
    static var someTypeProperty: Int { get }
}

2. 方法要求

協定可以要求遵循它的類型提供特定的實例方法和類型方法。

protocol RandomNumberGenerator {
    func random() -> Double
}

3. 可變方法要求

有時協定的方法可能需要修改其遵循者。mutating關鍵字用於標記這些方法。

protocol Togglable {
    mutating func toggle()
}

4. 協定的繼承

協定可以繼承其他協定的要求。

protocol PrettyPrintable: SomeProtocol {
    func prettyDescription() -> String
}

5. 擴展和協定

使用擴展,你可以為協定提供方法、計算屬性的默認實現,甚至提供其他協定的實現。

extension PrettyPrintable {
    func prettyDescription() -> String {
        return "Pretty Description"
    }
}

協定的使用

協定允許我們建立靈活、可重用的代碼。它們可以用作類型,並與關聯類型一起使用,使得設計更具靈活性。

例如,我們可以建立一個接受遵循PrettyPrintable協定的任何類型的函數:

func printPrettyDescription(thing: PrettyPrintable) {
    print(thing.prettyDescription())
}

總結:

協定在Swift中扮演著極其重要的角色,它為我們提供了一個強大的工具,讓我們能夠設計更加靈活和可重用的代碼。經過今天的學習,你應該已經了解了協定的基礎,以及如何在Swift中有效地使用它們。


上一篇
第九天:Swift 繼承和多態性
下一篇
第十一天:Swift進階 - 閉包
系列文
swift 30天之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言